import base64
url = "https://www.cnblogs.com/songzhixue/中文地址买买买"
bytes_url = url.encode('utf-8')
str_url = base64.b64encode(url.encode('utf-8'))  # 被编码的参数必须是二进制数据
print(str(str_url,'utf-8'))

#解密
debs64=base64.b64decode(str_url)
print(str(debs64,'utf-8'))



# -*- coding=utf-8-*-
from Crypto.Cipher import AES
import os
from Crypto import Random
import base64

"""
aes加密算法
padding : PKCS7


AES是一种对称加密算法，对称指加密和解密使用同一个密钥； 256指密钥的长度是256bit，即32个英文字符的长度；密钥的长度决定了AES加密的轮数
安装模块pip install pycryptodome，pip install crcmod
"""
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
import hashlib
from crcmod import *
from binascii import *
import binascii

#例子如下
#明文:str(binascii.b2a_hex(str.encode('tuya49368a48b746')))[2:-1]
#密文:51506024af73925e15da8873afb08f9d
#key:str(binascii.b2a_hex(str.encode('8sHRRhqNAdXnSvpA')))[2:-1]
#iv:str(binascii.b2a_hex(str.encode('8sHRRhqNAdXnSvpA')))[2:-1]

#如果text不足16位的倍数就用"00"补足,即采用NoPadding方式补齐
def PKCS_zero(text):
    newbytes = '00'
    if len(text) % 32:
        add = 32 - (len(text) % 32)
        add = add >> 1
    else:
        add = 0
    text = text + newbytes * add
    return text
    
# 加密函数
def AES_CBC_encrypt(text,key,iv):
    print("AES_CBC_encrypt")
    print(" key  :", key, type(key))
    print(" iv   :", iv, type(iv))
    print("plain :", text, type(text))

    mode = AES.MODE_CBC
    text = PKCS_zero(text)
    text = bytes.fromhex(text)
    print("plain :", bytes.hex(text),type(text))
    key = bytes.fromhex(key)
    iv = bytes.fromhex(iv)

    cryptos = AES.new(key, mode, iv)
    cipher_text = bytes.hex(cryptos.encrypt(text))
    # 因为AES加密后的字符串不一定是ascii字符集的，输出保存可能存在问题，所以这里转为16进制字符串

    print("cipher:", cipher_text, type(cipher_text))
    print("************************************************")
    return cipher_text
    # 解密后，去掉补足的空格用strip() 去掉
   
#AES-CBC解密
def AES_CBC_decrypt(text,key,iv):
    print("AES_CBC_decrypt")
    print(" key  :", key, type(key))
    print(" iv   :", iv, type(iv))
    print("plain :", text, type(text))

    text = bytes.fromhex(text)
    key = bytes.fromhex(key)
    iv  = bytes.fromhex(iv)

    mode = AES.MODE_CBC
    cryptos = AES.new(key, mode, iv)

    plain_text = bytes.hex(cryptos.decrypt(text))

    print("cipher:", plain_text, type(plain_text))
    print("************************************************")

    return plain_text
if __name__ == "__main__":
    strDemo=str(binascii.b2a_hex(str.encode('加密是中文可能么？','utf-8')))[2:-1]
    print ("===0==")
    print(strDemo)
    #key = str(binascii.b2a_hex(str.encode('8sHRRhqNAdXnSvpA')))[2:-1] #128位加密的key
    key = str(binascii.b2a_hex(str.encode('t6LtKa3tD5X6qaJ6qOrAW3XmobFrY6ob')))[2:-1]   #256位key
    iv = str(binascii.b2a_hex(str.encode('8sHRRhqNAdXnSvpA')))[2:-1]
    res = AES_CBC_encrypt(strDemo, key, iv)
    print ("===1==")
    print (res) # 2eDiseYiSX62qk/WS/ZDmg==
    print ("===2==")
    outText=AES_CBC_decrypt(res, key, iv);
    print(str(binascii.unhexlify (outText),'utf-8')) # 123456
    

#SHA1加密，非对称算法
import hashlib
 
str = "中国你好"
a = hashlib.sha1(str.encode("utf-8")).hexdigest()
print("sha1加密前为 ：",str)
print("sha1加密前后 ：",a)


# MD5加密，非对称算法
str = '中国你好MD5'
 
# 创建md5对象，
#md5对象，md5不能反解，但是加密是固定的，就是关系是一一对应，所以有缺陷，可以被对撞出来
hl = hashlib.md5()
 
#要对哪个字符串进行加密，就放这里
# 此处必须声明encode
# 若写法为hl.update(str)  报错为： Unicode-objects must be encoded before hashing
hl.update(str.encode(encoding='utf-8'))
 
print('MD5加密前为 ：' + str)
#hl.hexdigest()) #拿到加密字符串
print('MD5加密后为 ：' + hl.hexdigest())